
function TreeNode(val) {
    this.val = val;
    this.left = this.right = null;
}
/**
 * @param {number[]} preorder
 * @param {number[]} inorder
 * @return {TreeNode}
 */
 var buildTree = function(preorder, inorder) {
   if(preorder === null || inorder === null) return null // 如果两个有一个是空的 就返回一个空数组
  function construct(preOrderId,vinl,vinr){ // preOrderId是前序遍历的首节点的下标 vinl是左边界 vinr是有边界
    if(vinl > vinr) return null  // 需要确定边界条件 
    var val = preorder[preOrderId] // 获得首位字符的值
    var index = inorder.indexOf(val) // 找出这个值在中序遍历的下标
    let node = new TreeNode(val) // 生成一个节点
    var leftSize = index - vinl // 找到这个左子树的长度 不用减一 index是根节点的下标
    node.left = construct(preOrderId+1,vinl,index-1) // 这是变成+1 左边界还是原来的左边界 ,有边界变成index-1
    node.right = construct(preOrderId+leftSize+1,index+1,vinr)
    return node
  }
  return construct(0,0,inorder.length-1)
};